package com.swyc.osschat.Test.LambdaTest.Controller;

import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.DoubleConsumer;
import java.util.function.ObjDoubleConsumer;

import com.google.common.collect.Lists;
import com.swyc.osschat.Test.LambdaTest.Bean.Student;

/**
 * accept(T t)对给定的参数T执行定义的操作
 * @author zhaol@yunrong.cn
 * @version V2.1
 * @since 2.1.0 2019/8/12 15:01
 * BiConsumer<T,U>
 * 提供两个自定义类型的输入参数，不返回执行结果
 * DoubleConsumer
 * 表示接受单个double值参数，但不返回结果的操作
 * IntConsumer
 * 表示接受单个int值参数，但不返回结果的操作
 * LongConsumer
 * 表示接受单个long值参数，但不返回结果的操作
 * ObjDoubleConsumer<T>
 * 表示接受object值和double值，但是不返回任何操作结果
 * ObjIntConsumer<T>
 * 表示接受object值和int值，但是不返回任何操作结果
 * ObjLongConsumer<T>
 * 表示接受object值和long值，但是不返回任何操作结果
 */
public class ConsumerTest2 {
    public static void main(String[] args) {
        List<Student> studentList = Student.generateData();
        List<Student> resultList = Lists.newArrayList();
        /** 筛选出姓名为梅杰的人 */
        Consumer<Student> studentConsumer = x -> {
            if ("梅杰".equals(x.getName())){
                resultList.add(x);
            }
        };
        /** andThen 筛选出姓名为梅杰且性别为男的student*/
        studentConsumer = studentConsumer.andThen(x -> resultList.removeIf(y -> !"1".equals(y.getSex())));
        studentList.forEach(studentConsumer);
        /** BiConsumer(提供两个自定义类型的输入参数，不返回执行结果) */
        List<Student> sb = Lists.newArrayList();
        BiConsumer<Student, Student> biConsumer = (a, b) -> {
            sb.add(a);
            sb.add(b);
        };
        biConsumer.accept(studentList.get(0),studentList.get(1));
        BiConsumer<Student,Student> biConsumer1 = (a,b)-> System.out.println(Student.beanToString(a)+Student.beanToString(b));
        biConsumer.andThen(biConsumer1).accept(studentList.get(2),studentList.get(3));
        /** DoubleConsumer(表示接受单个double值参数，但不返回结果的操作) */
        DoubleConsumer doubleConsumer = System.out::println;
        doubleConsumer.accept(1.3);
        DoubleConsumer doubleConsumer1 = System.out::println;
        doubleConsumer.andThen(doubleConsumer1).accept(3.1);
        /** ObjDoubleConsumer<T>(表示接受object值和double值，但是不返回任何操作结果) */
        ObjDoubleConsumer<String> objDoubleConsumer = (obj, doub)
            -> System.out.println(obj + doub);
        objDoubleConsumer.accept("金额为：",33.12);
    }
}
